<!DOCTYPE html>

































































<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.ico" />
<title>Drag and Drop | Android Developers</title>
<link href="../../../assets/android-developer-docs-devguide.css" rel="stylesheet" type="text/css" />
<script src="../../../assets/search_autocomplete.js" type="text/javascript"></script>
<script src="../../../assets/jquery-resizable.min.js" type="text/javascript"></script>
<script src="../../../assets/android-developer-docs.js" type="text/javascript"></script>
<script src="../../../assets/prettify.js" type="text/javascript"></script>
<script type="text/javascript">
  setToRoot("../../../");
</script>
<noscript>
  <style type="text/css">
    html,body{overflow:auto;}
    #body-content{position:relative; top:0;}
    #doc-content{overflow:visible;border-left:3px solid #666;}
    #side-nav{padding:0;}
    #side-nav .toggle-list ul {display:block;}
    #resize-packages-nav{border-bottom:3px solid #666;}
  </style>
</noscript>
</head>
<body class="gc-documentation">

  <div id="header">
      <div id="headerLeft">
          <a href="../../../index.html" tabindex="-1"><img
              src="../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
          <ul id="header-tabs" class="guide">
    
	<li id="home-link"><a href="../../../offline.html">
	
		<span class="en">Home</span>
		<span style="display:none" class="de">Startseite</span>
		<span style="display:none" class="es"></span>
		<span style="display:none" class="fr"></span>
		<span style="display:none" class="it"></span>
		<span style="display:none" class="ja">ホーム</span>
		<span style="display:none" class="zh-CN">主页</span>
		<span style="display:none" class="zh-TW">首頁</span>
	
	</a></li>
	<li id="sdk-link"><a href="../../../sdk/index.html">
		<span class="en">SDK</span>
	</a></li>
	<li id="guide-link"><a href="../../../guide/index.html" onClick="return loadLast('guide')">
	
		<span class="en">Dev Guide</span>
		<span style="display:none" class="de">Handbuch</span>
		<span style="display:none" class="es">Guía</span>
		<span style="display:none" class="fr">Guide</span>
		<span style="display:none" class="it">Guida</span>
		<span style="display:none" class="ja">開発ガイド</span>
		<span style="display:none" class="zh-CN">开发人员指南</span>
		<span style="display:none" class="zh-TW">開發指南</span>
	
	</a></li>
	<li id="reference-link"><a href="../../../reference/packages.html" onClick="return loadLast('reference')">
	
		<span class="en">Reference</span>
		<span style="display:none" class="de">Referenz</span>
		<span style="display:none" class="es">Referencia</span>
		<span style="display:none" class="fr">Référence</span>
		<span style="display:none" class="it">Riferimento</span>
		<span style="display:none" class="ja">リファレンス</span>
		<span style="display:none" class="zh-CN">参考</span>
		<span style="display:none" class="zh-TW">參考資料</span>
	
	</a></li>
	<li id="resources-link"><a href="../../../resources/index.html" onClick="return loadLast('resources')">
	
		<span class="en">Resources</span>
		<span style="display:none" class="de"></span>
		<span style="display:none" class="es"></span>
		<span style="display:none" class="fr"></span>
		<span style="display:none" class="it"></span>
    		<span style="display:none" class="ja"></span>
		<span style="display:none" class="zh-CN"></span>
		<span style="display:none" class="zh-TW"></span>
	
	</a></li>
	<li id="videos-link"><a href="../../../videos/index.html" onClick="return loadLast('videos')">
	
		<span class="en">Videos</span>
		<span style="display:none" class="de"></span>
		<span style="display:none" class="es"></span>
		<span style="display:none" class="fr"></span>
		<span style="display:none" class="it"></span>
		<span style="display:none" class="ja">ビデオ</span>
		<span style="display:none" class="zh-CN"></span>
		<span style="display:none" class="zh-TW"></span>
	
	</a></li>
	<li><a href="http://android-developers.blogspot.com" onClick="return requestAppendHL(this.href)">
	
		<span class="en">Blog</span>
		<span style="display:none" class="de"></span>
		<span style="display:none" class="es"></span>
		<span style="display:none" class="fr"></span>
		<span style="display:none" class="it"></span>
		<span style="display:none" class="ja">ブログ</span>
		<span style="display:none" class="zh-CN">博客</span>
		<span style="display:none" class="zh-TW">網誌</span>
	
	</a></li>


     
</ul>
     
      </div>
      <div id="headerRight">
          <div id="headerLinks">
          
          <a href="http://www.android.com">Android.com</a>
          </div>
  <div id="search" >
      <div id="searchForm">
          <form accept-charset="utf-8" class="gsc-search-box" 
                onsubmit="return submit_search()">
            <table class="gsc-search-box" cellpadding="0" cellspacing="0"><tbody>
                <tr>
                  <td class="gsc-input">
                    <input id="search_autocomplete" class="gsc-input" type="text" size="33" autocomplete="off"
                      title="search developer docs" name="q"
                      value="search developer docs"
                      onFocus="search_focus_changed(this, true)"
                      onBlur="search_focus_changed(this, false)"
                      onkeydown="return search_changed(event, true, '../../../')"
                      onkeyup="return search_changed(event, false, '../../../')" />
                  <div id="search_filtered_div" class="no-display">
                      <table id="search_filtered" cellspacing=0>
                      </table>
                  </div>
                  </td>
                  <td class="gsc-search-button">
                    <input type="submit" value="Search" title="search" id="search-button" class="gsc-search-button" />
                  </td>
                  <td class="gsc-clear-button">
                    <div title="clear results" class="gsc-clear-button">&nbsp;</div>
                  </td>
                </tr></tbody>
              </table>
          </form>
      </div><!-- searchForm -->
  </div><!-- search -->
      </div><!-- headerRight -->
      <script type="text/javascript">
        <!--  
        changeTabLang(getLangPref());
        //-->
      </script>
  </div><!-- header -->

  <div class="g-section g-tpl-240" id="body-content">
    <div class="g-unit g-first" id="side-nav">
      <div id="devdoc-nav">
<ul>

  <li>
    <h2><span class="en">Android Basics</span>
        <span class="de" style="display:none">Einführung in Android</span>
        <span class="es" style="display:none">Información básica sobre Android</span>
        <span class="fr" style="display:none">Présentation d'Android</span>
        <span class="it" style="display:none">Nozioni di base su Android</span>
        <span class="ja" style="display:none">Android の基本</span>
        <span class="zh-CN" style="display:none">Android 基础知识</span>
        <span class="zh-TW" style="display:none">Android 簡介</span>
    </h2>
    <ul>
      <li><a href="../../../guide/basics/what-is-android.html">
        <span class="en">What Is Android?</span>
        <span class="de" style="display:none">Was ist Android?</span>
        <span class="es" style="display:none">¿Qué es Android?</span>
        <span class="fr" style="display:none">Qu'est-ce qu'Android&nbsp;?</span>
        <span class="it" style="display:none">Che cos'è Android?</span>
        <span class="ja" style="display:none">Android とは</span>
        <span class="zh-CN" style="display:none">Android 是什么？</span>
        <span class="zh-TW" style="display:none">什麼是 Android？</span>
          </a></li>
      <li><a href="../../../guide/topics/fundamentals.html">
        <span class="en">Application Fundamentals</span>
        <span class="de" style="display:none">Anwendungsgrundlagen</span>
        <span class="es" style="display:none">Fundamentos de las aplicaciones</span>
        <span class="fr" style="display:none">Principes de base des applications</span>
        <span class="it" style="display:none">Concetti fondamentali sulle applicazioni</span>
        <span class="ja" style="display:none">開発の基礎</span>
        <span class="zh-CN" style="display:none">应用程序基础</span>
        <span class="zh-TW" style="display:none">應用程式基本原理</span>
      </a></li>

  <!--  <li><a style="color:gray;">The Android SDK</a></li> -->
  <!--  <li><a style="color:gray;">Walkthrough for Developers</a></li> -->
      <!-- quick overview of what it's like to develop on Android -->
    </ul>
  </li>

  <li>
    <h2>
      <span class="en">Framework Topics</span>
      <span class="de" style="display:none">Framework-Themen</span>
      <span class="es" style="display:none">Temas sobre el framework</span>
      <span class="fr" style="display:none">Thèmes relatifs au framework</span>
      <span class="it" style="display:none">Argomenti relativi al framework</span>
      <span class="ja" style="display:none">フレームワーク トピック</span>
      <span class="zh-CN" style="display:none">框架主题</span>
      <span class="zh-TW" style="display:none">架構主題</span>
    </h2>
    <ul>
      <li class="toggle-list">
        <div><a href="../../../guide/topics/fundamentals/activities.html">
          <span class="en">Activities</span>
        </a></div>
        <ul>
          <li><a href="../../../guide/topics/fundamentals/fragments.html">
            <span class="en">Fragments</span>
          </a></li>
          <li><a href="../../../guide/topics/fundamentals/loaders.html">
            <span class="en">Loaders</span>
          </a></li>
          <li><a href="../../../guide/topics/fundamentals/tasks-and-back-stack.html">
            <span class="en">Tasks and Back Stack</span></a></li>
        </ul>
      </li>
      <li class="toggle-list">
        <div><a href="../../../guide/topics/fundamentals/services.html">
          <span class="en">Services</span>
        </a></div>
        <ul>
          <li><a href="../../../guide/topics/fundamentals/bound-services.html">
            <span class="en">Bound Services</span>
          </a></li>
        </ul>
      </li>
      <li><a href="../../../guide/topics/providers/content-providers.html">
            <span class="en">Content Providers</span>
          </a></li>
      <li><a href="../../../guide/topics/intents/intents-filters.html">
            <span class="en">Intents and Intent Filters</span>
          </a></li>
      <li><a href="../../../guide/topics/fundamentals/processes-and-threads.html">
            <span class="en">Processes and Threads</span>
          </a></li>
    </ul>


    <ul>
      <li class="toggle-list">
        <div><a href="../../../guide/topics/ui/index.html">
            <span class="en">User Interface</span>
          </a></div>
        <ul>
          <li><a href="../../../guide/topics/ui/declaring-layout.html">
               <span class="en">XML Layouts</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/ui-events.html">
                <span class="en">Input Events</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/menus.html">
               <span class="en">Menus</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/actionbar.html">
               <span class="en">Action Bar</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/dialogs.html">
                <span class="en">Dialogs</span>
              </a></li>
          <li class="toggle-list">
            <div><a href="../../../guide/topics/ui/notifiers/index.html">
                <span class="en">Notifications</span>
            </a></div>
            <ul>
              <li><a href="../../../guide/topics/ui/notifiers/toasts.html">
                <span class="en">Toast Notifications</span>
              </a></li>
              <li><a href="../../../guide/topics/ui/notifiers/notifications.html">
                <span class="en">Status Bar Notifications</span>
              </a></li>
            </ul>
          </li>
          <li><a href="../../../guide/topics/ui/drag-drop.html">
                <span class="en">Drag and Drop</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/themes.html">
                <span class="en">Styles and Themes</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/custom-components.html">
                <span class="en">Custom Components</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/binding.html">
                <span class="en">Binding to Data with AdapterView</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/layout-objects.html">
                <span class="en">Common Layout Objects</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/how-android-draws.html">
                <span class="en">How Android Draws Views</span>
              </a></li>
        </ul>
      </li><!-- end of User Interface -->

      <li class="toggle-list">
        <div><a href="../../../guide/topics/resources/index.html">
               <span class="en">Application Resources</span>
             </a></div>
        <ul>
          <li><a href="../../../guide/topics/resources/providing-resources.html">
                <span class="en">Providing Resources</span>
              </a></li>
          <li><a href="../../../guide/topics/resources/accessing-resources.html">
                <span class="en">Accessing Resources</span>
              </a></li>
          <li><a href="../../../guide/topics/resources/runtime-changes.html">
                <span class="en">Handling Runtime Changes</span>
              </a></li>
          <li><a href="../../../guide/topics/resources/localization.html">
                <span class="en">Localization</span>
              </a></li>
          <li class="toggle-list">
            <div><a href="../../../guide/topics/resources/available-resources.html">
              <span class="en">Resource Types</span>
            </a></div>
            <ul>
              <li><a href="../../../guide/topics/resources/animation-resource.html">Animation</a></li>
              <li><a href="../../../guide/topics/resources/color-list-resource.html">Color State List</a></li>
              <li><a href="../../../guide/topics/resources/drawable-resource.html">Drawable</a></li>
              <li><a href="../../../guide/topics/resources/layout-resource.html">Layout</a></li>
              <li><a href="../../../guide/topics/resources/menu-resource.html">Menu</a></li>
              <li><a href="../../../guide/topics/resources/string-resource.html">String</a></li>
              <li><a href="../../../guide/topics/resources/style-resource.html">Style</a></li>
              <li><a href="../../../guide/topics/resources/more-resources.html">More Types</a></li>
            </ul>
          </li><!-- end of resource types -->
        </ul>
      </li><!-- end of app resources -->
      <li class="toggle-list">
        <div><a href="../../../guide/topics/data/data-storage.html">
            <span class="en">Data Storage</span>
          </a></div>
          <ul>
            <li><a href="../../../guide/topics/data/backup.html">
                <span class="en">Data Backup</span>
              </a>
            </li>
          </ul>
      </li>
      <li><a href="../../../guide/topics/security/security.html">
            <span class="en">Security and Permissions</span>
          </a></li>
      <li class="toggle-list">
        <div><a href="../../../guide/topics/manifest/manifest-intro.html">
          <span class="en">The AndroidManifest.xml File</span>
        </a></div>
        <ul>
          <li><a href="../../../guide/topics/manifest/action-element.html">&lt;action&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/activity-alias-element.html">&lt;activity-alias&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/application-element.html">&lt;application&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/category-element.html">&lt;category&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/compatible-screens-element.html">&lt;compatible-screens&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/data-element.html">&lt;data&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/grant-uri-permission-element.html">&lt;grant-uri-permission&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/instrumentation-element.html">&lt;instrumentation&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/intent-filter-element.html">&lt;intent-filter&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/manifest-element.html">&lt;manifest&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/meta-data-element.html">&lt;meta-data&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/path-permission-element.html">&lt;path-permission&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/permission-element.html">&lt;permission&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/permission-group-element.html">&lt;permission-group&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/permission-tree-element.html">&lt;permission-tree&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/provider-element.html">&lt;provider&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/receiver-element.html">&lt;receiver&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/service-element.html">&lt;service&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/supports-gl-texture-element.html">&lt;supports-gl-texture&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/supports-screens-element.html">&lt;supports-screens&gt;</a></li><!-- ##api level 4## -->
          <li><a href="../../../guide/topics/manifest/uses-configuration-element.html">&lt;uses-configuration&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/uses-feature-element.html">&lt;uses-feature&gt;</a></li> <!-- ##api level 4## -->
          <li><a href="../../../guide/topics/manifest/uses-library-element.html">&lt;uses-library&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/uses-permission-element.html">&lt;uses-permission&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/uses-sdk-element.html">&lt;uses-sdk&gt;</a></li>
        </ul>
      </li><!-- end of the manifest file -->
    </ul>

    <ul>
    <li class="toggle-list">
        <div><a href="../../../guide/topics/graphics/index.html">
            <span class="en">Graphics</span>
          </a><span class="new-child">new!</span></div>
        <ul>
          <li><a href="../../../guide/topics/graphics/2d-graphics.html">
              <span class="en">Canvas and Drawables</span></a></li>
          <li><a href="../../../guide/topics/graphics/hardware-accel.html">
              <span class="en">Hardware Acceleration</span></a>
            <span class="new">new!</span></li>
          <li><a href="../../../guide/topics/graphics/opengl.html">
              <span class="en">OpenGL</span>
            </a><span class="new">updated</span></li>
        </ul>
      </li>
      <li class="toggle-list">
        <div><a href="../../../guide/topics/graphics/animation.html">
            <span class="en">Animation</span>
          </a></div>
        <ul>
          <li><a href="../../../guide/topics/graphics/prop-animation.html">
              <span class="en">Property Animation</span></a></li>
          <li><a href="../../../guide/topics/graphics/view-animation.html">
              <span class="en">View Animation</span></a></li>
          <li><a href="../../../guide/topics/graphics/drawable-animation.html">
              <span class="en">Drawable Animation</span></a></li>
        </ul>
      </li>
      <li class="toggle-list">
	        <div><a href="../../../guide/topics/renderscript/index.html">
	            <span class="en">RenderScript</span>
	          </a></div>
	        <ul>
	          <li><a href="../../../guide/topics/renderscript/graphics.html">
	                <span class="en">Graphics</span>
	              </a>
	          </li>
	          <li><a href="../../../guide/topics/renderscript/compute.html">
	                <span class="en">Compute</span>
	              </a>
	          </li>
	        </ul>
  	  </li>

      <li class="toggle-list">
          <div><a href="../../../guide/topics/media/index.html">
            <span class="en">Multimedia and Camera</span>
          </a><span class="new">updated</span></div>
          <ul>
            <li><a href="../../../guide/topics/media/mediaplayer.html">
                  <span class="en">Media Playback</span></a>
                </li>
            <li><a href="../../../guide/topics/media/jetplayer.html">
                  <span class="en">JetPlayer</span></a>
                </li>
            <li><a href="../../../guide/topics/media/camera.html">
                  <span class="en">Camera</span></a>
                  <span class="new">new!</span>
                </li>
            <li><a href="../../../guide/topics/media/audio-capture.html">
                  <span class="en">Audio Capture</span></a>
                </li>
          </ul>
      </li>
      <li>
        <a href="../../../guide/topics/clipboard/copy-paste.html">
            <span class="en">Copy and Paste</span>
        </a></li>
  <!--<li class="toggle-list">
        <div><a style="color:gray;">Sensors</a></div>
          <ul>
            <li><a style="color:gray;">Camera</a></li>
            <li><a style="color:gray;">Compass</a></li>
            <li><a style="color:gray;">Accelerometer</a></li>
          </ul>
      </li> -->
      <li class="toggle-list">
        <div><a href="../../../guide/topics/location/index.html">
               <span class="en">Location and Maps</span>
             </a></div>
        <ul>
          <li><a href="../../../guide/topics/location/obtaining-user-location.html">
                <span class="en">Obtaining User Location</span>
              </a></li>
        </ul>
      </li>
  <!--<li class="toggle-list">
        <div><a style="color:gray;">Wireless Controls</a></div>
          <ul>
            <li><a style="color:gray;">Wi-Fi</a></li>
          </ul>
      </li> -->
  <!--<li><a style="color:gray;">Localization</a></li>  -->
      <li><a href="../../../guide/topics/appwidgets/index.html">
            <span class="en">App Widgets</span></a>
          </li>
      <li><a href="../../../guide/topics/wireless/bluetooth.html">
            <span class="en">Bluetooth</span></a>
          </li>
      <li><a href="../../../guide/topics/nfc/index.html">
            <span class="en">Near Field Communication</span>
          </a></li>
      <li class="toggle-list">
          <div><a href="../../../guide/topics/usb/index.html">
            <span class="en">USB</span></a>
          </div>
            <ul>
              <li><a href="../../../guide/topics/usb/accessory.html">Accessory</a></li>
              <li><a href="../../../guide/topics/usb/host.html">Host</a></li>
              <li><a href="../../../guide/topics/usb/adk.html">Open Accessory Dev Kit</a></li>
            </ul>
          </li>

       <li><a href="../../../guide/topics/network/sip.html">
            <span class="en">Session Initiation Protocol</span>
          </a></li>
      <li class="toggle-list">
        <div><a href="../../../guide/topics/search/index.html">
            <span class="en">Search</span>
          </a></div>
          <ul>
            <li><a href="../../../guide/topics/search/search-dialog.html">Creating a Search Interface</a></li>
            <li><a href="../../../guide/topics/search/adding-recent-query-suggestions.html">Adding Recent Query Suggestions</a></li>
            <li><a href="../../../guide/topics/search/adding-custom-suggestions.html">Adding Custom Suggestions</a></li>
            <li><a href="../../../guide/topics/search/searchable-config.html">Searchable Configuration</a></li>
          </ul>
      </li>
      <li><a href="../../../guide/topics/admin/device-admin.html">
            <span class="en">Device Administration</span></a>
      </li>
      <li class="toggle-list">
           <div>
                <a href="../../../guide/topics/testing/index.html">
                   <span class="en">Testing</span>
               </a>
           </div>
           <ul>
              <li>
                <a href="../../../guide/topics/testing/testing_android.html">
                <span class="en">Testing Fundamentals</span></a>
              </li>
              <li>
                <a href="../../../guide/topics/testing/activity_testing.html">
                <span class="en">Activity Testing</span></a>
              </li>
              <li>
                <a href="../../../guide/topics/testing/contentprovider_testing.html">
                <span class="en">Content Provider Testing</span></a>
              </li>
              <li>
                <a href="../../../guide/topics/testing/service_testing.html">
                <span class="en">Service Testing</span></a>
              </li>
              <li>
                <a href="../../../guide/topics/testing/what_to_test.html">
                <span class="en">What To Test</span></a>
              </li>
           </ul>
      </li>
    </ul>
  </li>

  <li>
    <h2>
      <span class="en">Android Market Topics</span>
    </h2>
    <ul>
      <li><a href="../../../guide/publishing/licensing.html">
          <span class="en">Application Licensing</span></a>
      </li>
      <li class="toggle-list">
        <div><a href="../../../guide/market/billing/index.html">
            <span class="en">In-app Billing</span></a>
        </div>
        <ul>
          <li><a href="../../../guide/market/billing/billing_overview.html">
              <span class="en">In-app Billing Overview</span></a>
          </li>
          <li><a href="../../../guide/market/billing/billing_integrate.html">
              <span class="en">Implementing In-app Billing</span></a>
          </li>
          <li><a href="../../../guide/market/billing/billing_best_practices.html">
              <span class="en">Security and Design</span></a>
          </li>
          <li><a href="../../../guide/market/billing/billing_testing.html">
              <span class="en">Testing In-app Billing</span></a>
          </li>
          <li><a href="../../../guide/market/billing/billing_admin.html">
              <span class="en">Administering In-app Billing</span></a>
          </li>
          <li><a href="../../../guide/market/billing/billing_reference.html">
              <span class="en">In-app Billing Reference</span></a>
          </li>
        </ul>
      </li>
      <li><a href="../../../guide/appendix/market-filters.html">
          <span class="en">Market Filters</span></a>
      </li>
      <li><a href="../../../guide/market/publishing/multiple-apks.html">
          <span class="en">Multiple APK Support</span></a>
      </li>
    </ul>
  </li>


  <li>
    <h2><span class="en">Developing</span>
               <span class="de" style="display:none">Entwicklung</span>
               <span class="es" style="display:none">Desarrollo</span>
               <span class="fr" style="display:none">Développement</span>
               <span class="it" style="display:none">Sviluppo</span>
               <span class="ja" style="display:none">開発</span>
               <span class="zh-CN" style="display:none">开发</span>
               <span class="zh-TW" style="display:none">開發</span>
    </h2>
    <ul>
  <!--<li><a href="">Developing for Android</a></li>
      signing, upgrading, selecting a package name, select device profile, touch, trackball, dpad available, etc. -->
      <li>
        <a href="../../../guide/developing/index.html">
        <span class="en">Introduction</span></a>
      </li>

      <li class="toggle-list">
        <div>
           <a href="../../../guide/developing/devices/index.html">
                <span class="en">Managing Virtual Devices</span>
            </a>
        </div>
        <ul>
          <li>
            <a href="../../../guide/developing/devices/managing-avds.html">
              <span class="en">With AVD Manager</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/devices/managing-avds-cmdline.html">
              <span class="en">From the Command Line</span>
            </a>
          </li>
          <li>
           <a href="../../../guide/developing/devices/emulator.html">
                <span class="en">Using the Android Emulator</span>
            </a>
          </li>
        </ul>
      </li>
      <li>
        <a href="../../../guide/developing/device.html">
          <span class="en">Using Hardware Devices</span>
        </a>
      </li>

      <li class="toggle-list">
        <div>
          <a href="../../../guide/developing/projects/index.html">
            <span class="en">Managing Projects</span>
          </a>
        </div>
        <ul>
          <li>
            <a href="../../../guide/developing/projects/projects-eclipse.html">
              <span class="en">From Eclipse with ADT</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/projects/projects-cmdline.html">
                <span class="en">From the Command Line</span>
            </a>
          </li>
        </ul>
      </li>

      <li class="toggle-list">
        <div>
          <a href="../../../guide/developing/building/index.html">
            <span class="en">Building and Running</span>
          </a>
        </div>
        <ul>
          <li><a href="../../../guide/developing/building/building-eclipse.html">
            <span class="en">From Eclipse with ADT</span>
          </a></li>
          <li><a href="../../../guide/developing/building/building-cmdline.html">
            <span class="en">From the Command Line</span></a></li>
        </ul>
      </li>

      <li class="toggle-list">
        <div>
          <a href="../../../guide/developing/debugging/index.html">
            <span class="en">Debugging</span>
          </a>
        </div>
        <ul>
          <li>
            <a href="../../../guide/developing/debugging/debugging-projects.html">
                <span class="en">From Eclipse with ADT</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/debugging/debugging-projects-cmdline.html">
                <span class="en">From Other IDEs</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/debugging/ddms.html">
              <span class="en">Using DDMS</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/debugging/debugging-log.html">
                <span class="en">Reading and Writing Logs</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/debugging/debugging-ui.html">
                <span class="en">Debugging and Profiling UIs</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/debugging/debugging-tracing.html">
                <span class="en">Profiling with Traceview and dmtracedump</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/debugging/debugging-devtools.html">
                <span class="en">Using the Dev Tools App</span>
            </a>
          </li>
        </ul>
      </li>

      <li class="toggle-list">
           <div>
                <a href="../../../guide/developing/testing/index.html">
                   <span class="en">Testing</span>
               </a>
           </div>
           <ul>
              <li>
                <a href="../../../guide/developing/testing/testing_eclipse.html">
                  <span class="en">From Eclipse with ADT</span>
                </a>
              </li>

              <li>
                <a href="../../../guide/developing/testing/testing_otheride.html">
                  <span class="en">From Other IDEs</span>
                </a>
              </li>
           </ul>
         </li>

         <li class="toggle-list">
        <div><a href="../../../guide/developing/tools/index.html">
            <span class="en">Tools</span>
          </a></div>
        <ul>
          <li><a href="../../../guide/developing/tools/adb.html">adb</a></li>
          <li><a href="../../../guide/developing/tools/adt.html">ADT</a></li>
          <li><a href="../../../guide/developing/tools/android.html">android</a></li>
          <li><a href="../../../guide/developing/tools/bmgr.html">bmgr</a>
          <li><a href="../../../guide/developing/tools/dmtracedump.html">dmtracedump</a></li>
          <li><a href="../../../guide/developing/tools/draw9patch.html">Draw
          9-Patch</a></li>
          <li><a href="../../../guide/developing/tools/emulator.html">Emulator</a></li>
          <li><a href="../../../guide/developing/tools/etc1tool.html">etc1tool</a></li>
          <li><a href="../../../guide/developing/tools/hierarchy-viewer.html">Hierarchy Viewer</a></li>
          <li><a href="../../../guide/developing/tools/hprof-conv.html">hprof-conv</a></li>
          <li><a href="../../../guide/developing/tools/layoutopt.html">layoutopt</a></li>
          <li><a href="../../../guide/developing/tools/logcat.html">logcat</a></li>
          <li><a href="../../../guide/developing/tools/mksdcard.html">mksdcard</a></li>
          <li><a href="../../../guide/developing/tools/monkey.html">Monkey</a></li>
          <li class="toggle-list">
            <div><a href="../../../guide/developing/tools/monkeyrunner_concepts.html">
              <span class="en">monkeyrunner</span>
            </a></div>
            <ul>
              <li><a href="../../../guide/developing/tools/MonkeyDevice.html">
                <span class="en">MonkeyDevice</span>
                </a></li>
              <li><a href="../../../guide/developing/tools/MonkeyImage.html">
                <span class="en">MonkeyImage</span>
                </a></li>
              <li><a href="../../../guide/developing/tools/MonkeyRunner.html">
                <span class="en">MonkeyRunner</span>
                </a></li>
            </ul>
          </li>
          <li><a href="../../../guide/developing/tools/proguard.html">ProGuard</a></li>
          <li><a href="../../../guide/developing/tools/adb.html#sqlite">sqlite3</a></li>
          <li><a href="../../../guide/developing/tools/traceview.html">Traceview</a></li>
          <li><a href="../../../guide/developing/tools/zipalign.html">zipalign</a></li>
        </ul>
      </li>
    </ul>
  </li>

  <li>
    <h2><span class="en">Publishing</span>
        <span class="de" style="display:none">Veröffentlichung</span>
        <span class="es" style="display:none">Publicación</span>
        <span class="fr" style="display:none">Publication</span>
        <span class="it" style="display:none">Pubblicazione</span>
        <span class="ja" style="display:none">公開</span>
        <span class="zh-CN" style="display:none">发布</span>
        <span class="zh-TW" style="display:none">發佈</span>
    </h2>
    <ul>
      <li><a href="../../../guide/publishing/app-signing.html">
            <span class="en">Signing Your Applications</span>
            <span class="de" style="display:none">Signieren Ihrer Anwendungen</span>
            <span class="es" style="display:none">Firma de aplicaciones</span>
            <span class="fr" style="display:none">Attribution de votre signature <br />à vos applications</span>
            <span class="it" style="display:none">Firma delle applicazioni</span>
            <span class="ja" style="display:none">アプリケーションへの署名</span>
            <span class="zh-CN" style="display:none">应用程序签名</span>
            <span class="zh-TW" style="display:none">簽署應用程式</span>
          </a></li>
      <li><a href="../../../guide/publishing/versioning.html">
            <span class="en">Versioning Your Applications</span>
            <span class="de" style="display:none">Versionsverwaltung für Ihre <br />Anwendungen</span>
            <span class="es" style="display:none">Versiones de las aplicaciones</span>
            <span class="fr" style="display:none">Attribution d'une version à vos applications</span>
            <span class="it" style="display:none">Controllo versioni delle applicazioni</span>
            <span class="ja" style="display:none">アプリケーションのバージョニング</span>
            <span class="zh-CN" style="display:none">应用程序版本控制</span>
            <span class="zh-TW" style="display:none">應用程式版本設定</span>
          </a></li>
      <li><a href="../../../guide/publishing/preparing.html">
            <span class="en">Preparing to Publish</span>
            <span class="de" style="display:none">Vorbereitung auf die Veröffentlichung</span>
            <span class="es" style="display:none">Publicación de aplicaciones</span>
            <span class="fr" style="display:none">Préparation à la publication</span>
            <span class="it" style="display:none">Preparativi per la pubblicazione</span>
            <span class="ja" style="display:none">公開の準備</span>
            <span class="zh-CN" style="display:none">准备发布</span>
            <span class="zh-TW" style="display:none">準備發佈</span>
          </a></li>
      <li><a href="../../../guide/publishing/publishing.html">
            <span class="en">Publishing on Android Market</span>
          </a></li>
    </ul>
  </li>

  <li>
    <h2><span class="en">Best Practices</span>
               <span class="de" style="display:none">Bewährte Verfahren</span>
               <span class="es" style="display:none">Prácticas recomendadas</span>
               <span class="fr" style="display:none">Meilleures pratiques</span>
               <span class="it" style="display:none">Best practice</span>
               <span class="ja" style="display:none">ベスト プラクティス</span>
               <span class="zh-CN" style="display:none">最佳实践</span>
               <span class="zh-TW" style="display:none">最佳實務</span>
    </h2>
    <ul>
      <li><a href="../../../guide/practices/compatibility.html">
            <span class="en">Compatibility</span>
          </a></li>
      <li class="toggle-list">
        <div><a href="../../../guide/practices/screens_support.html">
          <span class="en">Supporting Multiple Screens</span>
        </a></div>
        <ul>
          <li><a href="../../../guide/practices/screens-distribution.html">
            <span class="en">Distributing to Specific Screens</span>
          </a></li>
          <li><a href="../../../guide/practices/screen-compat-mode.html">
            <span class="en">Screen Compatibility Mode</span>
          </a></li>
          <li><a href="../../../guide/practices/screens-support-1.5.html">
            <span class="en">Strategies for Android 1.5</span>
          </a></li>
        </ul>
      </li>
      <li><a href="../../../guide/practices/optimizing-for-3.0.html">
            <span class="en">Optimizing Apps for Android 3.0</span>
          </a></li>
      <li class="toggle-list">
        <div><a href="../../../guide/practices/ui_guidelines/index.html">
               <span class="en">UI Guidelines</span>
             </a></div>
        <ul>
          <li class="toggle-list">
            <div><a href="../../../guide/practices/ui_guidelines/icon_design.html">
                   <span class="en">Icon Design <span class="new">updated</span></span>
                 </a></div>
            <ul>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_launcher.html">
                    <span class="en">Launcher Icons <span class="new">updated</span></span>
                  </a></li>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_menu.html">
                    <span class="en">Menu Icons</span>
                  </a></li>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_action_bar.html">
                    <span class="en">Action Bar Icons <span class="new">new!</span></span>
                  </a></li>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_status_bar.html">
                    <span class="en">Status Bar Icons <span class="new">updated</span></span>
                  </a></li>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_tab.html">
                    <span class="en">Tab Icons</span>
                  </a></li>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_dialog.html">
                    <span class="en">Dialog Icons</span>
                  </a></li>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_list.html">
                    <span class="en">List View Icons</span>
                  </a></li>
            </ul>
          </li>
          <li><a href="../../../guide/practices/ui_guidelines/widget_design.html">
                <span class="en">App Widget Design <span class="new">updated</span></span>
              </a></li>
          <li><a href="../../../guide/practices/ui_guidelines/activity_task_design.html">
                <span class="en">Activity and Task Design</span>
              </a></li>
          <li><a href="../../../guide/practices/ui_guidelines/menu_design.html">
                <span class="en">Menu Design</span>
              </a></li>
        </ul>
      </li>
      </ul>
      <ul>
      <li><a href="../../../guide/practices/design/accessibility.html">
            <span class="en">Designing for Accessibility</span>
          </a></li>
      <li class="toggle-list">
        <div><a href="../../../guide/practices/design/performance.html">
            <span class="en">Designing for Performance</span>
          </a></div>
        <ul>
          <li><a href="../../../guide/practices/design/jni.html">
                <span class="en">JNI Tips</span>
              </a></li>
        </ul>
      </li>
      <li><a href="../../../guide/practices/design/responsiveness.html">
            <span class="en">Designing for Responsiveness</span>
          </a></li>
      <li><a href="../../../guide/practices/design/seamlessness.html">
            <span class="en">Designing for Seamlessness</span>
          </a></li>
    </ul>
  </li>

  <li>
    <h2><span class="en">Web Applications</span>
    </h2>
    <ul>
      <li><a href="../../../guide/webapps/index.html">
            <span class="en">Web Apps Overview</span>
          </a></li>
      <li><a href="../../../guide/webapps/targeting.html">
            <span class="en">Targeting Screens from Web Apps</span>
          </a></li>
      <li><a href="../../../guide/webapps/webview.html">
            <span class="en">Building Web Apps in WebView</span>
          </a></li>
      <li><a href="../../../guide/webapps/debugging.html">
            <span class="en">Debugging Web Apps</span>
          </a></li>
      <li><a href="../../../guide/webapps/best-practices.html">
            <span class="en">Best Practices for Web Apps</span>
          </a></li>
    </ul>
  </li>

  <li>
    <h2><span class="en">Appendix</span>
               <span class="de" style="display:none">Anhang</span>
               <span class="es" style="display:none">Apéndice</span>
               <span class="fr" style="display:none">Annexes</span>
               <span class="it" style="display:none">Appendice</span>
               <span class="ja" style="display:none">付録</span>
               <span class="zh-CN" style="display:none">附录</span>
               <span class="zh-TW" style="display:none">附錄</span>
    </h2>
    <ul>
      <li><a href="../../../guide/appendix/api-levels.html">
            <span class="en">Android API Levels</span>
          </a></li>
      <li><a href="../../../guide/appendix/install-location.html">
            <span class="en">App Install Location</span>
          </a></li>
      <li><a href="../../../guide/appendix/media-formats.html">
            <span class="en">Supported Media Formats <span class="new">updated</span></span>
          </a></li>
      <li><a href="../../../guide/appendix/g-app-intents.html">
            <span class="en">Intents List: Google Apps</span>
          </a></li>
      <li><a href="../../../guide/developing/tools/aidl.html">AIDL</a></li>
      <li><a href="../../../guide/appendix/glossary.html">
            <span class="en">Glossary</span>
          </a></li>
    </ul>
  </li>

</ul>

<script type="text/javascript">
<!--
    buildToggleLists();
    changeNavLang(getLangPref());
//-->
</script>

      </div>
    </div> <!-- end side-nav -->
    <script>
      addLoadEvent(function() {
        scrollIntoView("devdoc-nav");
        });
    </script>




<div class="g-unit" id="doc-content"><a name="top"></a>

<div id="jd-header" class="guide-header">
  <span class="crumb">
    
      <a href="index.html">User Interface</a> >
    
  </span>
<h1>Drag and Drop</h1>
</div>

  <div id="jd-content">

    <div class="jd-descr">
    <div id="qv-wrapper">
    <div id="qv">
        <h2>Quickview</h2>
            <ul>
                <li>
                    Allow users to move data within your Activity layout using graphical gestures.
                </li>
                <li>
                    Supports operations besides data movement.
                </li>
                <li>
                    Only works within a single application.
                </li>
                <li>
                    Requires API 11.
                </li>
            </ul>
        <h2>In this document</h2>
        <ol>
            <li>
                <a href="#AboutDragging">Overview</a>
                <ol>
                    <li>
                        <a href="#DragDropLifecycle">The drag/drop process</a>
                    </li>
                    <li>
                        <a href="#AboutDragListeners">The drag event listener and callback method</a>
                    </li>
                    <li>
                        <a href="#AboutDragEvent">Drag events</a>
                    </li>
                    <li>
                        <a href="#AboutDragShadowBuilder">
                        The drag shadow</a>
                    </li>
                </ol>
            </li>
            <li>
                <a href="#DesignDragOperation">Designing a Drag and Drop Operation</a>
                <ol>
                    <li>
                        <a href="#StartDrag">Starting a drag</a>
                    </li>
                    <li>
                        <a href="#HandleStart">Responding to a drag start</a>
                    </li>
                    <li>
                        <a href="#HandleDuring">Handling events during the drag</a>
                    </li>
                    <li>
                        <a href="#HandleDrop">Responding to a drop</a>
                    </li>
                    <li>
                        <a href="#HandleEnd">Responding to a drag end</a>
                    </li>
                    <li>
                        <a href="#RespondEventSample">Responding to drag events: an example</a>
                    </li>
                </ol>
            </li>
        </ol>
        <h2>Key classes</h2>
        <ol>
            <li>
                <code><a href="../../../reference/android/view/View.html">View</a></code>
            </li>
            <li>
                <code><a href="../../../reference/android/view/View.OnLongClickListener.html">OnLongClickListener</a></code>
            </li>
            <li>
                <code><a href="../../../reference/android/view/View.OnDragListener.html">OnDragListener</a></code>
            </li>
            <li>
                <code><a href="../../../reference/android/view/DragEvent.html">DragEvent</a></code>
            </li>
            <li>
                <code><a href="../../../reference/android/view/View.DragShadowBuilder.html">DragShadowBuilder</a></code>
            </li>
            <li>
                <code><a href="../../../reference/android/content/ClipData.html">ClipData</a></code>
            </li>
            <li>
                <code><a href="../../../reference/android/content/ClipDescription.html">ClipDescription</a></code>
            </li>
        </ol>
        <h2>Related Samples</h2>
        <ol>
            <li>
                <a href="../../../resources/samples/HoneycombGallery/index.html">
                Honeycomb Gallery</a>.
            </li>
            <li>
                <a href="../../../resources/samples/ApiDemos/src/com/example/android/apis/view/DragAndDropDemo.html">
DragAndDropDemo.java</a> and
                <a href="../../../resources/samples/ApiDemos/src/com/example/android/apis/view/DraggableDot.html">
DraggableDot.java</a> in <a href="../../../resources/samples/ApiDemos/index.html">Api Demos</a>.
            </li>
        </ol>
        <h2>See also</h2>
        <ol>
            <li>
            <a href="../../../guide/topics/providers/content-providers.html">Content Providers</a>
            </li>
            <li>
                <a href="../../../guide/topics/ui/ui-events.html">Input Events</a>
            </li>
        </ol>
    </div>
</div>
<p>
    With the Android drag/drop framework, you can allow your users to move data
    from one View to another View in the current layout using a graphical drag and drop gesture.
    The framework includes a drag event class, drag listeners, and helper methods and classes.
</p>
<p>
    Although the framework is primarily designed for data movement, you can use
    it for other UI actions. For example, you could create an app that mixes colors when the user
    drags a color icon over another icon. The rest of this topic, however, describes the
    framework in terms of data movement.
</p>
<h2 id="AboutDragging">Overview</h2>
<p>
    A drag and drop operation starts when the user makes some gesture that you recognize as a
    signal to start dragging data. In response, your application tells the system that the drag is
    starting. The system calls back to your application to get a representation of the data
    being dragged. As the user's finger moves this representation (a &quot;drag shadow&quot;)
    over the current layout, the system sends drag events to the drag event listener objects and
    drag event callback methods associated with the <code><a href="../../../reference/android/view/View.html">View</a></code> objects in the layout.
    Once the user releases the drag shadow, the system ends the drag operation.
</p>
<p>
    You create a drag event listener object (&quot;listeners&quot;) from a class that implements
    <code><a href="../../../reference/android/view/View.OnDragListener.html">View.OnDragListener</a></code>. You set the drag event listener object for a View
    with the View object's
    <code><a href="../../../reference/android/view/View.html#setOnDragListener(android.view.View.OnDragListener)">setOnDragListener()</a></code> method.
    Each View object also has a <code><a href="../../../reference/android/view/View.html#onDragEvent(android.view.DragEvent)">onDragEvent()</a></code>
    callback method. Both of these are described in more detail in the section
    <a href="#AboutDragListeners">The drag event listener and callback method</a>.
</p>
<p class="note">
    <strong>Note</strong>: For the sake of simplicity, the following sections refer to the routine
    that receives drag events as the &quot;drag event listener&quot;, even though it may actually
    be a callback method.
</p>
<p>
    When you start a drag, you include both the data you are moving and metadata describing this
    data as part of the call to the system. During the drag, the system sends drag events to the
    drag event listeners or callback methods of each View in the layout. The listeners or callback
    methods can use the metadata to decide if they want to accept the data when it is dropped.
    If the user drops the data over a View object, and that View object's listener or callback
    method has previously told the system that it wants to accept the drop, then the system sends
    the data to the listener or callback method in a drag event.
</p>
<p>
    Your application tells the system to start a drag by calling the
    <code><a href="../../../reference/android/view/View.html#startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int)">startDrag()</a></code>
    method. This tells the system to start sending drag events. The method also sends the data that
    you are dragging.
</p>
<p>
    You can call
    <code><a href="../../../reference/android/view/View.html#startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int)">startDrag()</a></code>
    for any attached View in the current layout. The system only uses the View object to get access
    to global settings in your layout.
</p>
<p>
    Once your application calls
    <code><a href="../../../reference/android/view/View.html#startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int)">startDrag()</a></code>,
    the rest of the process uses events that the system sends to the View objects in your current
    layout.
</p>
<h3 id="DragDropLifecycle">The drag/drop process</h3>
<p>
    There are basically four steps or states in the drag and drop process:
</p>
<dl>
    <dt>
        <em>Started</em>
    </dt>
    <dd>
        In response to the user's gesture to begin a drag, your application calls
        <code><a href="../../../reference/android/view/View.html#startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int)">startDrag()</a></code>
        to tell the system to start a drag. The arguments
        <code><a href="../../../reference/android/view/View.html#startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int)">startDrag()</a></code>
        provide the data to be dragged, metadata for this data, and a callback for drawing the
        drag shadow.
        <p>
            The system first responds by calling back to your application to get a drag shadow. It
            then displays the drag shadow on the device.
        </p>
        <p>
            Next, the system sends a drag event with action type
            <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_STARTED">ACTION_DRAG_STARTED</a></code> to the drag event listeners for
            all the View objects in the current layout. To continue to receive drag events,
            including a possible drop event, a drag event listener must return <code>true</code>.
            This registers the listener with the system. Only registered listeners continue to
            receive drag events. At this point, listeners can also change the appearance of their
            View object to show that the listener can accept a drop event.
        </p>
        <p>
            If the drag event listener returns <code>false</code>, then it will not receive drag
            events for the current operation until the system sends a drag event with action type
            <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENDED">ACTION_DRAG_ENDED</a></code>. By sending <code>false</code>, the
            listener tells the system that it is not interested in the drag operation and
            does not want to accept the dragged data.
        </p>
    </dd>
    <dt>
        <em>Continuing</em>
    </dt>
    <dd>
        The user continues the drag. As the drag shadow intersects the bounding box of a View
        object, the system sends one or more drag events to the View object's drag event
        listener (if it is registered to receive events). The listener may choose to
        alter its View object's appearance in response to the event. For example, if the event
        indicates that the drag shadow has entered the bounding box of the View
        (action type <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENTERED">ACTION_DRAG_ENTERED</a></code>), the listener
        can react by highlighting its View.
    </dd>
    <dt>
        <em>Dropped</em>
    </dt>
    <dd>
        The user releases the drag shadow within the bounding box of a View that can accept the
        data. The system sends the View object's listener a drag event with action type
        <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code>. The drag event contains the data that was
        passed to the system in the call to
        <code><a href="../../../reference/android/view/View.html#startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int)">startDrag()</a></code>
        that started the operation. The listener is expected to return boolean <code>true</code> to
        the system if code for accepting the drop succeeds.
        <p>
            Note that this step only occurs if the user drops the drag shadow within the bounding
            box of a View whose listener is registered to receive drag events. If the user releases
            the drag shadow in any other situation, no <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code>
            drag event is sent.
        </p>
    </dd>
    <dt>
        <em>Ended</em>
    </dt>
    <dd>
        After the user releases the drag shadow, and after the system sends out (if necessary)
        a drag event with action type <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code>, the system sends
        out a drag event with action type <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENDED">ACTION_DRAG_ENDED</a></code> to
        indicate that the drag operation is over. This is done regardless of where the user released
        the drag shadow. The event is sent to every listener that is registered to receive drag
        events, even if the listener received the <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code> event.
    </dd>
</dl>
<p>
    Each of these four steps is described in more detail in the section
    <a href="#DesignDragOperation">Designing a Drag and Drop Operation</a>.
</p>
<h3 id="AboutDragListeners">The drag event listener and callback method</h3>
<p>
    A View receives drag events with either a drag event listener that implements
    <code><a href="../../../reference/android/view/View.OnDragListener.html">View.OnDragListener</a></code> or with its
    <code><a href="../../../reference/android/view/View.html#onDragEvent(android.view.DragEvent)">onDragEvent(DragEvent)</a></code> callback method.
    When the system calls the method or listener, it passes to them
    a <code><a href="../../../reference/android/view/DragEvent.html">DragEvent</a></code> object.
</p>
<p>
    You will probably want to use the listener in most cases. When you design UIs, you usually
    don't subclass View classes, but using the callback method forces you to do this in order to
    override the method. In comparison, you can implement one listener class and then use it with
    several different View objects. You can also implement it as an anonymous inline class. To
    set the listener for a View object, call
<code><a href="../../../reference/android/view/View.html#setOnDragListener(android.view.View.OnDragListener)">setOnDragListener()</a></code>.
</p>
<p>
    You can have both a listener and a callback method for View object. If this occurs,
    the system first calls the listener. The system doesn't call the callback method unless the
    listener returns <code>false</code>.
</p>
<p>
    The combination of the <code><a href="../../../reference/android/view/View.html#onDragEvent(android.view.DragEvent)">onDragEvent(DragEvent)</a></code> method and
    <code><a href="../../../reference/android/view/View.OnDragListener.html">View.OnDragListener</a></code> is analogous to the combination
    of the <code><a href="../../../reference/android/view/View.html#onTouchEvent(android.view.MotionEvent)">onTouchEvent()</a></code> and
    <code><a href="../../../reference/android/view/View.OnTouchListener.html">View.OnTouchListener</a></code> used with touch events.
</p>
<h3 id="AboutDragEvent">Drag events</h3>
<p>
    The system sends out a drag event in the form of a <code><a href="../../../reference/android/view/DragEvent.html">DragEvent</a></code> object. The
    object contains an action type that tells the listener what is happening in the drag/drop
    process. The object contains other data, depending on the action type.
</p>
<p>
    To get the action type, a listener calls <code><a href="../../../reference/android/view/DragEvent.html#getAction()">getAction()</a></code>. There
    are six possible values, defined by constants in the <code><a href="../../../reference/android/view/DragEvent.html">DragEvent</a></code> class. These
    are listed in <a href="#table1">table 1</a>.
</p>
<p>
    The <code><a href="../../../reference/android/view/DragEvent.html">DragEvent</a></code> object also contains the data that your application provided
    to the system in the call to
    <code><a href="../../../reference/android/view/View.html#startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int)">startDrag()</a></code>.
    Some of the data is valid only for certain action types. The data that is valid for each action
    type is summarized in <a href="#table2">table 2</a>. It is also described in detail with
    the event for which it is valid in the section
    <a href="#DesignDragOperation">Designing a Drag and Drop Operation</a>.
</p>
<p class="table-caption" id="table1">
  <strong>Table 1.</strong> DragEvent action types
</p>
<table>
    <tr>
        <th scope="col">getAction() value</th>
        <th scope="col">Meaning</th>
    </tr>
    <tr>
        <td><code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_STARTED">ACTION_DRAG_STARTED</a></code></td>
        <td>
            A View object's drag event listener receives this event action type just after the
            application calls
<code><a href="../../../reference/android/view/View.html#startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int)">startDrag()</a></code> and
            gets a drag shadow.
        </td>
    </tr>
    <tr>
        <td><code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENTERED">ACTION_DRAG_ENTERED</a></code></td>
        <td>
            A View object's drag event listener receives this event action type when the drag shadow
            has just entered the bounding box of the View. This is the first event action type the
            listener receives when the drag shadow enters the bounding box. If the listener wants to
            continue receiving drag events for this operation, it must return boolean
            <code>true</code> to the system.
        </td>
    </tr>
    <tr>
        <td><code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_LOCATION">ACTION_DRAG_LOCATION</a></code></td>
        <td>
            A View object's drag event listener receives this event action type after it receives a
            <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENTERED">ACTION_DRAG_ENTERED</a></code> event while the drag shadow is
            still within the bounding box of the View.
        </td>
    </tr>
    <tr>
        <td><code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_EXITED">ACTION_DRAG_EXITED</a></code></td>
        <td>
            A View object's drag event listener receives this event action type after it receives a
            <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENTERED">ACTION_DRAG_ENTERED</a></code> and at least one
            <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_LOCATION">ACTION_DRAG_LOCATION</a></code> event, and after the user has moved
            the drag shadow outside the bounding box of the View.
        </td>
    </tr>
    <tr>
        <td><code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code></td>
        <td>
            A View object's drag event listener receives this event action type when the user
            releases the drag shadow over the View object. This action type is only sent to a View
            object's listener if the listener returned boolean <code>true</code> in response to the
            <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_STARTED">ACTION_DRAG_STARTED</a></code> drag event. This action type is not
            sent if the user releases the drag shadow on a View whose listener is not registered,
            or if the user releases the drag shadow on anything that is not part of the current
            layout.
            <p>
                The listener is expected to return boolean <code>true</code> if it successfully
                processes the drop. Otherwise, it should return <code>false</code>.
            </p>
        </td>
    </tr>
    <tr>
        <td><code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENDED">ACTION_DRAG_ENDED</a></code></td>
        <td>
            A View object's drag event listener receives this event action type
            when the system is ending the drag operation. This action type is not necessarily
            preceded by an <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code> event. If the system sent
            a <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code>, receiving the
            <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENDED">ACTION_DRAG_ENDED</a></code> action type does not imply that the
            drop operation succeeded. The listener must call
            <code><a href="../../../reference/android/view/DragEvent.html#getResult()">getResult()</a></code> to get the value that was
            returned in response to <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code>. If an
            <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code> event was not sent, then
            <code><a href="../../../reference/android/view/DragEvent.html#getResult()">getResult()</a></code> returns <code>false</code>.
        </td>
    </tr>
</table>
<p class="table-caption" id="table2">
  <strong>Table 2.</strong> Valid DragEvent data by action type</p>
<table>
    <tr>
        <th scope="col"><code><a href="../../../reference/android/view/DragEvent.html#getAction()">getAction()</a></code> value</th>
        <th scope="col"><code><a href="../../../reference/android/view/DragEvent.html#getClipDescription()">getClipDescription()</a></code> value</th>
        <th scope="col"><code><a href="../../../reference/android/view/DragEvent.html#getLocalState()">getLocalState()</a></code> value</th>
        <th scope="col"><code><a href="../../../reference/android/view/DragEvent.html#getX()">getX()</a></code> value</th>
        <th scope="col"><code><a href="../../../reference/android/view/DragEvent.html#getY()">getY()</a></code> value</th>
        <th scope="col"><code><a href="../../../reference/android/view/DragEvent.html#getClipData()">getClipData()</a></code> value</th>
        <th scope="col"><code><a href="../../../reference/android/view/DragEvent.html#getResult()">getResult()</a></code> value</th>
    </tr>
    <tr>
        <td><code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_STARTED">ACTION_DRAG_STARTED</a></code></td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">&nbsp;</td>
        <td style="text-align: center;">&nbsp;</td>
        <td style="text-align: center;">&nbsp;</td>
    </tr>
    <tr>
        <td><code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENTERED">ACTION_DRAG_ENTERED</a></code></td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">&nbsp;</td>
        <td style="text-align: center;">&nbsp;</td>
    </tr>
    <tr>
        <td><code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_LOCATION">ACTION_DRAG_LOCATION</a></code></td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">&nbsp;</td>
        <td style="text-align: center;">&nbsp;</td>
    </tr>
    <tr>
        <td><code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_EXITED">ACTION_DRAG_EXITED</a></code></td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">&nbsp;</td>
        <td style="text-align: center;">&nbsp;</td>
        <td style="text-align: center;">&nbsp;</td>
        <td style="text-align: center;">&nbsp;</td>
    </tr>
    <tr>
        <td><code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code></td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">&nbsp;</td>
    </tr>
    <tr>
        <td><code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENDED">ACTION_DRAG_ENDED</a></code></td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">X</td>
        <td style="text-align: center;">&nbsp;</td>
        <td style="text-align: center;">&nbsp;</td>
        <td style="text-align: center;">&nbsp;</td>
        <td style="text-align: center;">X</td>
    </tr>
</table>
<p>
    The <code><a href="../../../reference/android/view/DragEvent.html#getAction()">getAction()</a></code>,
    <code><a href="../../../reference/android/view/DragEvent.html#describeContents()">describeContents()</a></code>,
    <code><a href="../../../reference/android/view/DragEvent.html#writeToParcel(android.os.Parcel, int)">writeToParcel()</a></code>, and
    <code><a href="../../../reference/android/view/DragEvent.html#toString()">toString()</a></code> methods always return valid data.
</p>
<p>
    If a method does not contain valid data for a particular action type, it returns either
    <code>null</code> or 0, depending on its result type.
</p>
<h3 id="AboutDragShadowBuilder">
    The drag shadow
</h3>
<p>
    During a drag and drop operation, the system displays a image that the user drags.
    For data movement, this image represents the data being dragged. For other operations, the
    image represents some aspect of the drag operation.
</p>
<p>
    The image is called a drag shadow. You create it with methods you declare for a
    <code><a href="../../../reference/android/view/View.DragShadowBuilder.html">View.DragShadowBuilder</a></code> object, and then pass it to the system when you
    start a drag using
    <code><a href="../../../reference/android/view/View.html#startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int)">startDrag()</a></code>.
    As part of its response to
    <code><a href="../../../reference/android/view/View.html#startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int)">startDrag()</a></code>,
    the system invokes the callback methods you've defined in
    <code><a href="../../../reference/android/view/View.DragShadowBuilder.html">View.DragShadowBuilder</a></code> to obtain a drag shadow.
</p>
<p>
    The <code><a href="../../../reference/android/view/View.DragShadowBuilder.html">View.DragShadowBuilder</a></code> class has two constructors:
</p>
    <dl>
    <dt><code><a href="../../../reference/android/view/View.DragShadowBuilder.html#View.DragShadowBuilder(android.view.View)">View.DragShadowBuilder(View)</a></code></dt>
    <dd>
        This constructor accepts any of your application's
        <code><a href="../../../reference/android/view/View.html">View</a></code> objects. The constructor stores the View object
        in the <code><a href="../../../reference/android/view/View.DragShadowBuilder.html">View.DragShadowBuilder</a></code> object, so during
        the callback you can access it as you construct your drag shadow.
        It doesn't have to be associated with the View (if any) that the user
        selected to start the drag operation.
        <p>
            If you use this constructor, you don't have to extend
            <code><a href="../../../reference/android/view/View.DragShadowBuilder.html">View.DragShadowBuilder</a></code> or override its methods. By default,
            you will get a drag shadow that has the same appearance as the View you pass as an
            argument, centered under the location where the user is touching the screen.
        </p>
    </dd>
    <dt><code><a href="../../../reference/android/view/View.DragShadowBuilder.html#View.DragShadowBuilder()">View.DragShadowBuilder()</a></code></dt>
    <dd>
        If you use this constructor, no View object is available in the
        <code><a href="../../../reference/android/view/View.DragShadowBuilder.html">View.DragShadowBuilder</a></code> object (the field is set to <code>null</code>).
        If you use this constructor, and you don't extend
        <code><a href="../../../reference/android/view/View.DragShadowBuilder.html">View.DragShadowBuilder</a></code> or override its methods,
        you will get an invisible drag shadow.
        The system does <em>not</em> give an error.
    </dd>
</dl>
<p>
    The <code><a href="../../../reference/android/view/View.DragShadowBuilder.html">View.DragShadowBuilder</a></code> class has two methods:
</p>
<dl>
    <dt>
<code><a href="../../../reference/android/view/View.DragShadowBuilder.html#onProvideShadowMetrics(android.graphics.Point, android.graphics.Point)">onProvideShadowMetrics()</a></code>
    </dt>
    <dd>
        The system calls this method immediately after you call
<code><a href="../../../reference/android/view/View.html#startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int)">startDrag()</a></code>. Use it
        to send to the system the dimensions and touch point of the drag shadow. The method has two
        arguments:
        <dl>
            <dt><em>dimensions</em></dt>
            <dd>
                A <code><a href="../../../reference/android/graphics/Point.html">Point</a></code> object. The drag shadow width goes in
                <code><a href="../../../reference/android/graphics/Point.html#x">x</a></code> and its height goes in
                <code><a href="../../../reference/android/graphics/Point.html#y">y</a></code>.
            </dd>
            <dt><em>touch_point</em></dt>
            <dd>
                A <code><a href="../../../reference/android/graphics/Point.html">Point</a></code> object. The touch point is the location within the
                drag shadow that should be under the user's finger during the drag. Its X
                position goes in <code><a href="../../../reference/android/graphics/Point.html#x">x</a></code> and its Y position goes in
                <code><a href="../../../reference/android/graphics/Point.html#y">y</a></code>
            </dd>
        </dl>
    </dd>
    <dt>
       <code><a href="../../../reference/android/view/View.DragShadowBuilder.html#onDrawShadow(android.graphics.Canvas)">onDrawShadow()</a></code>
    </dt>
    <dd>
        Immediately after the call to
<code><a href="../../../reference/android/view/View.DragShadowBuilder.html#onProvideShadowMetrics(android.graphics.Point, android.graphics.Point)">onProvideShadowMetrics()</a></code>
        the system calls
        <code><a href="../../../reference/android/view/View.DragShadowBuilder.html#onDrawShadow(android.graphics.Canvas)">onDrawShadow()</a></code> to get the
        drag shadow itself. The method has a single argument, a <code><a href="../../../reference/android/graphics/Canvas.html">Canvas</a></code>
        object that the system constructs from the parameters you provide in
<code><a href="../../../reference/android/view/View.DragShadowBuilder.html#onProvideShadowMetrics(android.graphics.Point, android.graphics.Point)">onProvideShadowMetrics()</a></code>
        Use it to draw the drag shadow in the provided <code><a href="../../../reference/android/graphics/Canvas.html">Canvas</a></code> object.
    </dd>
</dl>
<p>
    To improve performance, you should keep the size of the drag shadow small. For a single item,
    you may want to use a icon. For a multiple selection, you may want to use icons in a stack
    rather than full images spread out over the screen.
</p>
<h2 id="DesignDragOperation">Designing a Drag and Drop Operation</h2>
<p>
    This section shows step-by-step how to start a drag, how to respond to events during
    the drag, how respond to a drop event, and how to end the drag and drop operation.
</p>
<h3 id="StartDrag">Starting a drag</h3>
<p>
    The user starts a drag with a drag gesture, usually a long press, on a View object.
    In response, you should do the following:
</p>
<ol>
     <li>
        As necessary, create a <code><a href="../../../reference/android/content/ClipData.html">ClipData</a></code> and
        <code><a href="../../../reference/android/content/ClipData.Item.html">ClipData.Item</a></code> for the data being moved. As part of the
        ClipData object, supply metadata that is stored in a <code><a href="../../../reference/android/content/ClipDescription.html">ClipDescription</a></code>
        object within the ClipData. For a drag and drop operation that does not represent data
        movement, you may want to use <code>null</code> instead of an actual object.
        <p>
            For example, this code snippet shows how to respond to a long press on a ImageView
            by creating a ClipData object that contains the tag or label of an
            ImageView. Following this snippet, the next snippet shows how to override the methods in
            <code><a href="../../../reference/android/view/View.DragShadowBuilder.html">View.DragShadowBuilder</a></code>:
        </p>
<pre>
// Create a string for the ImageView label
private static final String IMAGEVIEW_TAG = &quot;icon bitmap&quot;

// Creates a new ImageView
ImageView imageView = new ImageView(this);

// Sets the bitmap for the ImageView from an icon bit map (defined elsewhere)
imageView.setImageBitmap(mIconBitmap);

// Sets the tag
imageView.setTag(IMAGEVIEW_TAG);

    ...

// Sets a long click listener for the ImageView using an anonymous listener object that
// implements the OnLongClickListener interface
imageView.setOnLongClickListener(new View.OnLongClickListener() {

    // Defines the one method for the interface, which is called when the View is long-clicked
    public boolean onLongClick(View v) {

    // Create a new ClipData.
    // This is done in two steps to provide clarity. The convenience method
    // ClipData.newPlainText() can create a plain text ClipData in one step.

    // Create a new ClipData.Item from the ImageView object's tag
    ClipData.Item item = new ClipData.Item(v.getTag());

    // Create a new ClipData using the tag as a label, the plain text MIME type, and
    // the already-created item. This will create a new ClipDescription object within the
    // ClipData, and set its MIME type entry to &quot;text/plain&quot;
    ClipData dragData = new ClipData(v.getTag(),ClipData.MIMETYPE_TEXT_PLAIN,item);

    // Instantiates the drag shadow builder.
    View.DrawShadowBuilder myShadow = new MyDragShadowBuilder(imageView);

    // Starts the drag

            v.startDrag(dragData,  // the data to be dragged
                        myShadow,  // the drag shadow builder
                        null,      // no need to use local data
                        0          // flags (not currently used, set to 0)
            );

    }
}
</pre>
    </li>
    <li>
        The following code snippet defines <code>myDragShadowBuilder</code>
        It creates a drag shadow for dragging a TextView as a small gray rectangle:
<pre>
    private static class MyDragShadowBuilder extends View.DragShadowBuilder {

    // The drag shadow image, defined as a drawable thing
    private static Drawable shadow;

        // Defines the constructor for myDragShadowBuilder
        public MyDragShadowBuilder(View v) {

            // Stores the View parameter passed to myDragShadowBuilder.
            super(v);

            // Creates a draggable image that will fill the Canvas provided by the system.
            shadow = new ColorDrawable(Color.LTGRAY);
        }

        // Defines a callback that sends the drag shadow dimensions and touch point back to the
        // system.
        &#64;Override
        public void onProvideShadowMetrics (Point size, Point touch)
            // Defines local variables
            private int width, height;

            // Sets the width of the shadow to half the width of the original View
            width = getView().getWidth() / 2;

            // Sets the height of the shadow to half the height of the original View
            height = getView().getHeight() / 2;

            // The drag shadow is a ColorDrawable. This sets its dimensions to be the same as the
            // Canvas that the system will provide. As a result, the drag shadow will fill the
            // Canvas.
            shadow.setBounds(0, 0, width, height);

            // Sets the size parameter's width and height values. These get back to the system
            // through the size parameter.
            size.set(width, height);

            // Sets the touch point's position to be in the middle of the drag shadow
            touch.set(width / 2, height / 2);
        }

        // Defines a callback that draws the drag shadow in a Canvas that the system constructs
        // from the dimensions passed in onProvideShadowMetrics().
        &#64;Override
        public void onDrawShadow(Canvas canvas) {

            // Draws the ColorDrawable in the Canvas passed in from the system.
            shadow.draw(canvas);
        }
    }
</pre>
        <p class="note">
            <strong>Note:</strong> Remember that you don't have to extend
            <code><a href="../../../reference/android/view/View.DragShadowBuilder.html">View.DragShadowBuilder</a></code>. The constructor
            <code><a href="../../../reference/android/view/View.DragShadowBuilder.html#View.DragShadowBuilder(android.view.View)">View.DragShadowBuilder(View)</a></code> creates a
            default drag shadow that's the same size as the View argument passed to it, with the
            touch point centered in the drag shadow.
        </p>
    </li>
</ol>
<h3 id="HandleStart">Responding to a drag start</h3>
<p>
    During the drag operation, the system dispatches drag events to the drag event listeners
    of the View objects in the current layout. The listeners should react
    by calling <code><a href="../../../reference/android/view/DragEvent.html#getAction()">getAction()</a></code> to get the action type.
    At the start of a drag, this methods returns <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_STARTED">ACTION_DRAG_STARTED</a></code>.
</p>
<p>
    In response to an event with the action type <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_STARTED">ACTION_DRAG_STARTED</a></code>,
    a listener should do the following:
</p>
<ol>
    <li>
        Call <code><a href="../../../reference/android/view/DragEvent.html#getClipDescription()">getClipDescription()</a></code> to get the
        <code><a href="../../../reference/android/content/ClipDescription.html">ClipDescription</a></code>. Use the MIME type methods in
        <code><a href="../../../reference/android/content/ClipDescription.html">ClipDescription</a></code> to see if the listener can accept the data being
        dragged.
        <p>
            If the drag and drop operation does not represent data movement, this may not be
            necessary.
        </p>
    </li>
    <li>
        If the listener can accept a drop, it should return <code>true</code>. This tells
        the system to continue to send drag events to the listener.
        If it can't accept a drop, it should return <code>false</code>, and the system
        will stop sending drag events until it sends out
        <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENDED">ACTION_DRAG_ENDED</a></code>.
    </li>
</ol>
<p>
    Note that for an <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_STARTED">ACTION_DRAG_STARTED</a></code> event, these
    the following <code><a href="../../../reference/android/view/DragEvent.html">DragEvent</a></code> methods are not valid:
    <code><a href="../../../reference/android/view/DragEvent.html#getClipData()">getClipData()</a></code>, <code><a href="../../../reference/android/view/DragEvent.html#getX()">getX()</a></code>,
    <code><a href="../../../reference/android/view/DragEvent.html#getY()">getY()</a></code>, and <code><a href="../../../reference/android/view/DragEvent.html#getResult()">getResult()</a></code>.
</p>
<h3 id="HandleDuring">Handling events during the drag</h3>
<p>
    During the drag, listeners that returned <code>true</code> in response to
    the <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_STARTED">ACTION_DRAG_STARTED</a></code> drag event continue to receive drag
    events. The types of drag events a listener receives during the drag depend on the location of
    the drag shadow and the visibility of the listener's View.
</p>
<p>
    During the drag, listeners primarily use drag events to decide if they should change the
    appearance of their View.
</p>
<p>
    During the drag, <code><a href="../../../reference/android/view/DragEvent.html#getAction()">getAction()</a></code> returns one of three
    values:
</p>
<ul>
    <li>
        <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENTERED">ACTION_DRAG_ENTERED</a></code>:
        The listener receives this when the touch point
        (the point on the screen underneath the user's finger) has entered the bounding box of the
        listener's View.
    </li>
    <li>
        <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_LOCATION">ACTION_DRAG_LOCATION</a></code>: Once the listener receives an
        <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENTERED">ACTION_DRAG_ENTERED</a></code> event, and before it receives an
        A<code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_EXITED">ACTION_DRAG_EXITED</a></code> event, it receives a new
        <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_LOCATION">ACTION_DRAG_LOCATION</a></code> event every time the touch point moves.
        The <code><a href="../../../reference/android/view/DragEvent.html#getX()">getX()</a></code> and <code><a href="../../../reference/android/view/DragEvent.html#getY()">getY()</a></code> methods
        return the the X and Y coordinates of the touch point.
    </li>
    <li>
        <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_EXITED">ACTION_DRAG_EXITED</a></code>:  This event is sent to a listener that
        previously received <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENTERED">ACTION_DRAG_ENTERED</a></code>, after
        the drag shadow is no longer within the bounding box of the listener's View.
    </li>
</ul>
<p>
    The listener does not need to react to any of these action types. If the listener returns a
    value to the system, it is ignored. Here are some guidelines for responding to each of
    these action types:
</p>
<ul>
    <li>
        In response to <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENTERED">ACTION_DRAG_ENTERED</a></code> or
        <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_LOCATION">ACTION_DRAG_LOCATION</a></code>, the listener can change the appearance
        of the View to indicate that it is about to receive a drop.
    </li>
    <li>
        An event with the action type <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_LOCATION">ACTION_DRAG_LOCATION</a></code> contains
        valid data for <code><a href="../../../reference/android/view/DragEvent.html#getX()">getX()</a></code> and
        <code><a href="../../../reference/android/view/DragEvent.html#getY()">getY()</a></code>, corresponding to the location of the touch point.
        The listener may want to use this information to alter the appearance of that part of the
        View that is at the touch point. The listener can also use this information
        to determine the exact position where the user is going to drop the drag shadow.
    </li>
    <li>
        In response to <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_EXITED">ACTION_DRAG_EXITED</a></code>, the listener should reset
        any appearance changes it applied in response to
        <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENTERED">ACTION_DRAG_ENTERED</a></code> or
        <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_LOCATION">ACTION_DRAG_LOCATION</a></code>. This indicates to the user that
        the View is no longer an imminent drop target.
    </li>
</ul>
<h3 id="HandleDrop">Responding to a drop</h3>
<p>
    When the user releases the drag shadow on a View in the application, and that View previously
    reported that it could accept the content being dragged, the system dispatches a drag event
    to that View with the action type <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code>. The listener
    should do the following:
</p>
<ol>
    <li>
        Call <code><a href="../../../reference/android/view/DragEvent.html#getClipData()">getClipData()</a></code> to get the
        <code><a href="../../../reference/android/content/ClipData.html">ClipData</a></code> object that was originally supplied in the call
        to
<code><a href="../../../reference/android/view/View.html#startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int)">startDrag()</a></code>
        and store it. If the drag and drop operation does not represent data movement,
        this may not be necessary.
    </li>
    <li>
        Return boolean <code>true</code> to indicate that the drop was processed successfully, or
        boolean <code>false</code> if it was not. The returned value becomes the value returned by
        <code><a href="../../../reference/android/view/DragEvent.html#getResult()">getResult()</a></code> for an
        <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENDED">ACTION_DRAG_ENDED</a></code> event.
        <p>
            Note that if the system does not send out an <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code>
            event, the value of <code><a href="../../../reference/android/view/DragEvent.html#getResult()">getResult()</a></code> for an
            <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENDED">ACTION_DRAG_ENDED</a></code> event is <code>false</code>.
        </p>
    </li>
</ol>
<p>
    For an <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code> event,
    <code><a href="../../../reference/android/view/DragEvent.html#getX()">getX()</a></code> and <code><a href="../../../reference/android/view/DragEvent.html#getY()">getY()</a></code>
    return the X and Y position of the drag point at the moment of the drop, using the coordinate
    system of the View that received the drop.
</p>
<p>
    The system does allow the user to release the drag shadow on a View whose listener is not
    receiving drag events. It will also allow the user to release the drag shadow
    on empty regions of the application's UI, or on areas outside of your application.
    In all of these cases, the system does not send an event with action type
    <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code>, although it does send out an
    <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENDED">ACTION_DRAG_ENDED</a></code> event.
</p>
<h3 id="HandleEnd">Responding to a drag end</h3>
<p>
    Immediately after the user releases the drag shadow, the system sends a
    drag event to all of the drag event listeners in your application, with an action type of
    <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DRAG_ENDED">ACTION_DRAG_ENDED</a></code>. This indicates that the drag operation is
    over.
</p>
<p>
    Each listener should do the following:
</p>
<ol>
    <li>
        If listener changed its View object's appearance during the operation, it should reset the
        View to its default appearance. This is a visual indication to the user that the operation
        is over.
    </li>
    <li>
        The listener can optionally call <code><a href="../../../reference/android/view/DragEvent.html#getResult()">getResult()</a></code> to find out more
        about the operation. If a listener returned <code>true</code> in response to an event of
        action type <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code>, then
        <code><a href="../../../reference/android/view/DragEvent.html#getResult()">getResult()</a></code> will return boolean <code>true</code>. In all
        other cases, <code><a href="../../../reference/android/view/DragEvent.html#getResult()">getResult()</a></code> returns boolean <code>false</code>,
        including any case in which the system did not send out a
        <code><a href="../../../reference/android/view/DragEvent.html#ACTION_DROP">ACTION_DROP</a></code> event.
    </li>
    <li>
        The listener should return boolean <code>true</code> to the system.
    </li>
</ol>
<p>
</p>
<h3 id="RespondEventSample">Responding to drag events: an example</h3>
<p>
    All drag events are initially received by your drag event method or listener. The following
    code snippet is a simple example of reacting to drag events in a listener:
</p>
<pre>
// Creates a new drag event listener
mDragListen = new myDragEventListener();

View imageView = new ImageView(this);

// Sets the drag event listener for the View
imageView.setOnDragListener(mDragListen);

...

protected class myDragEventListener implements View.OnDragEventListener {

    // This is the method that the system calls when it dispatches a drag event to the
    // listener.
    public boolean onDrag(View v, DragEvent event) {

        // Defines a variable to store the action type for the incoming event
        final int action = event.getAction();

        // Handles each of the expected events
        switch(action) {

            case DragEvent.ACTION_DRAG_STARTED:

                // Determines if this View can accept the dragged data
                if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {

                    // As an example of what your application might do,
                    // applies a blue color tint to the View to indicate that it can accept
                    // data.
                    v.setColorFilter(Color.BLUE);

                    // Invalidate the view to force a redraw in the new tint
                    v.invalidate();

                    // returns true to indicate that the View can accept the dragged data.
                    return(true);

                    } else {

                    // Returns false. During the current drag and drop operation, this View will
                    // not receive events again until ACTION_DRAG_ENDED is sent.
                    return(false);

                    }
                break;

            case DragEvent.ACTION_DRAG_ENTERED: {

                // Applies a green tint to the View. Return true; the return value is ignored.

                v.setColorFilter(Color.GREEN);

                // Invalidate the view to force a redraw in the new tint
                v.invalidate();

                return(true);

                break;

                case DragEvent.ACTION_DRAG_LOCATION:

                // Ignore the event
                    return(true);

                break;

                case DragEvent.ACTION_DRAG_EXITED:

                    // Re-sets the color tint to blue. Returns true; the return value is ignored.
                    v.setColorFilter(Color.BLUE);

                    // Invalidate the view to force a redraw in the new tint
                    v.invalidate();

                    return(true);

                break;

                case DragEvent.ACTION_DROP:

                    // Gets the item containing the dragged data
                    ClipData.Item item = event.getClipData().getItemAt(0);

                    // Gets the text data from the item.
                    dragData = item.getText();

                    // Displays a message containing the dragged data.
                    Toast.makeText(this, "Dragged data is " + dragData, Toast.LENGTH_LONG);

                    // Turns off any color tints
                    v.clearColorFilter();

                    // Invalidates the view to force a redraw
                    v.invalidate();

                    // Returns true. DragEvent.getResult() will return true.
                    return(true);

                break;

                case DragEvent.ACTION_DRAG_ENDED:

                    // Turns off any color tinting
                    v.clearColorFilter();

                    // Invalidates the view to force a redraw
                    v.invalidate();

                    // Does a getResult(), and displays what happened.
                    if (event.getResult()) {
                        Toast.makeText(this, "The drop was handled.", Toast.LENGTH_LONG);

                    } else {
                        Toast.makeText(this, "The drop didn't work.", Toast.LENGTH_LONG);

                    };

                    // returns true; the value is ignored.
                    return(true);

                break;

                // An unknown action type was received.
                default:
                    Log.e("DragDrop Example","Unknown action type received by OnDragListener.");

                break;
        };
    };
};
</pre>
    </div>

  <a href="#top" style="float:right">&uarr; Go to top</a>
  
    <p><a href="index.html">&larr; Back to User Interface</a></p>
  
  </div>

<div id="footer">


  <div id="copyright">
    
  Except as noted, this content is licensed under <a
  href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>. 
  For details and restrictions, see the <a href="../../../license.html">
  Content License</a>.
  </div>
  <div id="build_info">
    
  Android 4.0&nbsp;r1 - 17 Oct 2011 18:17

  </div>

  <div id="footerlinks">
    
  <p>
    <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
    <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
    <a href="http://www.android.com/branding.html">Brand Guidelines</a>
  </p>
  </div>

</div> <!-- end footer -->

</div><!-- end doc-content -->

</div> <!-- end body-content --> 

<script type="text/javascript">
init(); /* initialize android-developer-docs.js */
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-5831155-1");
pageTracker._trackPageview();
</script>

</body>
</html>



